Zašto vizualizacija?

Postoje dva osnovna razloga za vizualizaciju podataka:

Eksploratorna analiza podataka

Eksploratorna analiza podataka - EDA (engl. exploratory data analysis): proces analize podatkovnog skupa s ciljem upoznavanja s podacima i donošenjem određenih zaključaka.

Eksploratorna analiza podataka (2)

  1. Transformacija podataka
    • već smo upoznali učenjem paketa tidyr, dplyr
  2. Vizualizacija podataka
    • paketi base, grid, lattice, ggplot2
    • tema ove lekcije
  3. Modeliranje podataka
    • stvaranje sažetih, konciznih reprezentacija podataka kroz matematičke (i druge modele)
    • izrada prediktivnih i deskriptivnih modela
    • eksploatacija modela za donošenje odluka

Vizualizacija podataka u jeziku R

ZADATAK 12.1 - funkcija plot

x <- 1:50
# proslijedite `x` i `x*x` funkciji `plot`
plot(x, x*x)

Prednosti i nedostaci funkcije plot

Prednosti:

Nedostaci:

Dodatni vizualizacijski paketi

Paket grid


Paket lattice

Paket ggplot2

Paket ggplot2 (2)

Grafička gramatika i paket ggplot2

Grafička gramatika (engl. grammar of graphics) nam daje sljedeće:

Grafove gledamo kao svojevrsne “rečenice” čije razumijevanje ovisi o tome kako pojedine komponente uklopiti u jasnu, razumljivu cjelinu.

Naputak - graf gledati kao sumu “komponenti” od kojih svaka ima svoju ulogu i doprinosi konačnom rezultatu.

Grafička gramatika i paket ggplot2

Za početak, tri osnovne komponente:

  1. podaci (koje želimo vizualizirati)
  2. estetike (mapiranja podataka na elemente grafa)
  3. geometrije (grafička reprezentacija podataka na grafu)

graf = podaci + mapiranje + geometrija

Podaci / Estetike / Geometrija

Podatkovni skup je ključna komponenta grafa, predstavlja “ono što želimo vizualizirati”.

Podaci su neovisni od ostatka procesa vizualizacije, budući da se isti principi vizualizacije mogu primjeniti nad različitim podatkovnim skupovima).


Primjer: podatkovni skup mtcars:

##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

Podaci / Estetike / Geometrija

Pojam “estetika” nema veze sa “znanosti o lijepom”, ovdje se radi o odabiru kako ćemo na grafu prikazati (mapirati) pojedini stupac.

Uobičajeni princip:


Na primjer, za podatkovni skup mtcars odlučujemo:

wt -> os x

mpg -> os y

Podaci / Estetike / Geometrija

Osi koordinatnog sustava nisu jedine estetike, ovisno o tome kakav graf crtamo estetike mogu biti:

Estetiku možemo interpretirati i kao “ono što se objašnjava legendom”, pri čemu i osi x i y možemo smatrati svojevrsnim legendama.

Podaci / Estetike / Geometrija

Podaci / Estetike / Geometrija

ZADATAK 12.2 - upoznavanje sa podatkovnim skupom mtcars

Koristiti ćemo podatkovni skup mtcars koji dolazi sa jezikom R (paket datasets). Podatkovni skup možemo učitati u globalnu okolinu uz pomoć funkcije data.

# Učitajte podatkovni skup `mtcars` u globalnu okolinu
data(mtcars)
# proučite okvir `mtcars`  (head, glimpse, ?...)
head(mtcars)
summary(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
##       mpg             cyl             disp             hp       
##  Min.   :10.40   Min.   :4.000   Min.   : 71.1   Min.   : 52.0  
##  1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8   1st Qu.: 96.5  
##  Median :19.20   Median :6.000   Median :196.3   Median :123.0  
##  Mean   :20.09   Mean   :6.188   Mean   :230.7   Mean   :146.7  
##  3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0   3rd Qu.:180.0  
##  Max.   :33.90   Max.   :8.000   Max.   :472.0   Max.   :335.0  
##       drat             wt             qsec             vs        
##  Min.   :2.760   Min.   :1.513   Min.   :14.50   Min.   :0.0000  
##  1st Qu.:3.080   1st Qu.:2.581   1st Qu.:16.89   1st Qu.:0.0000  
##  Median :3.695   Median :3.325   Median :17.71   Median :0.0000  
##  Mean   :3.597   Mean   :3.217   Mean   :17.85   Mean   :0.4375  
##  3rd Qu.:3.920   3rd Qu.:3.610   3rd Qu.:18.90   3rd Qu.:1.0000  
##  Max.   :4.930   Max.   :5.424   Max.   :22.90   Max.   :1.0000  
##        am              gear            carb      
##  Min.   :0.0000   Min.   :3.000   Min.   :1.000  
##  1st Qu.:0.0000   1st Qu.:3.000   1st Qu.:2.000  
##  Median :0.0000   Median :4.000   Median :2.000  
##  Mean   :0.4062   Mean   :3.688   Mean   :2.812  
##  3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :1.0000   Max.   :5.000   Max.   :8.000

Crtanje prvog ggplot2 grafa

Odabrani podatkovni skup mtcars ima 32 obzervacije i 11 varijabli (sve numeričkog tipa). Zamislimo da želimo vizualizirati odnos dvije varijable, npr. potrošnju (mpg, koja predstavlja broj milja koliko auto prijeđe na jedan galon benzina) i težinu (wt, izraženu u tisućama funti).

Možemo odabrati sljedeći način mapiranja:

Crtanje prvog ggplot2 grafa

ggplot() + 
layer( data = mtcars,                      # 1. podaci
       mapping = aes(x = wt, y = mpg),     # 2. mapiranja / estetike
       geom = "point",                     # 3. geometrija
       stat = "identity",                  # za sada zanemariti
       position = "identity")              # za sada zanemariti

Crtanje prvog ggplot2 grafa

Obično ne koristimo funkciju layer već kombinaciju funkcija ggplot (u kojoj postavimo “zajedničke” parametre podataka i estetika) te odabrane pomoćne geom_X funkcije.

ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()

Crtanje prvog ggplot2 grafa

Postoji i funkcija qplot koja zapravo “imitira” sintaksu funkcije plot i služi za lakšu prilagodbu paketu ggplot za funkcije naviknute na osnovne načine vizualizacije u R-u. Ovu funkciju nećemo koristiti u nastavku uglavnom zbog njezinih ograničenih mogućnosti.

qplot(x = wt, y = mpg, data = mtcars)

ZADATAK 12.3 - shape estetika

Dodajmo još jednu varijablu u prikazani graf uz pomoć nove estetike - oblika točaka.

# faktorizirajte varijablu `cyl`
mtcars$cyl <- as.factor(mtcars$cyl)

# stvorite graf ovisnosti `mpg` o `wt`
# uz mapiranje `cyl` varijable na `shape` estetiku
ggplot(mtcars, aes(x = wt, y = mpg, shape=cyl)) + geom_point()

ZADATAK 12.4 - color estetika

Pogledajmo sada estetiku bojr - tj. color estetiku.

# stvorite graf ovisnosti `mpg` o `wt`
# ovaj put mapirajte `cyl` varijable na `color` estetiku
ggplot(mtcars, aes(x = wt, y = mpg, color=cyl)) + geom_point()

ZADATAK 12.5 - kombiniranje estetika

Istu varijablu slobodno možemo mapirati na više estetika.

# ponovite isti graf, ali varijablu `cyl` mapirajte
# i na `color` i na `shape` estetiku
ggplot(mtcars, aes(x = wt, y = mpg, shape=cyl, color=cyl)) + geom_point()

Preimenovanje osi, legende, dodavanje naslova

Ukoliko želimo, uz pomoć funkcije labs lako primenujemo osi ili legende te dodajemo naslov našem grafu. Sintaksa izgleda ovako:

ggplot(... ) + ...

... + labs(x = "x os", y = "y os", ...

title = "Naslov")

ZADATAK 12.6 - funkcija labs

# na sljedećem grafu preimenujte osi i legendu
# te dodajte adekvatni naslov (najbolje nešto što objašnjava graf)
ggplot(mtcars, aes(x = wt, y = mpg, color = cyl, shape = cyl)) + geom_point() + labs(x = "Car weight", y = "Miles per galon", color = "Number of cilinders", shape = "Number of cilinders", title = "Car weight to miles per galon ratio")

Fiksni parametri geometrije

Estetike tj. mapiranja direktno utječu na parametre geometrije, tj. oni vise o vrijednostima varijabli koje mapiramo na njih. Ukoliko želimo “fiksirati” parametre geometrije, dovoljno ih je navesti kao parametre geometrijskog sloja sa pripadajućim vrijednostima (ali NE unutar funkcije aes!).


Primjer sintakse:

ggplot(...) + ....

+ geom_point(color = "blue")


Primjer KRIVE sintakse (mapira riječ “blue” na estetiku ‘color’!):

ggplot(...) + ....

+ geom_point(aes(color = "blue"))


ZADATAK 12.7 - fiksni parametri geometrije

# nacrajte graf ovisnosti maksimalne brzine o težini automobila
# koristite geometriju točke
# obojite točke plavom bojom
ggplot(mtcars, aes(x = wt, y = qsec)) + geom_point(color="blue")

ZADATAK 12.8 - dodavanje linijskog sloja

# budući da stalno koristimo istu "osnovicu" grafa možemo ju
# pohraniti u zasebnu varijablu npr. imena `graf`

graf <- ggplot(mtcars, aes(x = wt, y = mpg)) 

# dodajte varijabli `graf` geometriju točaka a potom linijsku geometriju
graf + geom_point() + geom_line()

Aspekt statistike

Statistika je aspekt grafa koji automatski provodi dodatne izračune nad podacima prije same vizualizacije. Izračuni su najčešće agregacije (iako ne uvijek!). Neke češće korištene statistike su:

Paket ggplot2 nudi pomoćne funkcije za izračun statistika koje izgledaju ovako: stat_<ime_statistike>

ZADATAK 12.9 - funkcija stat_smooth i metoda lm

# dodajte geometriju točaka na varijablu `graf`
# te potom dodatni sloj sa krivuljom zaglađivanja
# koristite funkciju `stat_smooth` uz parametar `method` 
# postavljen na `lm` (linearno zaglađivanje)
graf + geom_point() + stat_smooth(method=lm)

ZADATAK 12.10 - funkcija stat_smooth i metoda loess

# ponovite postupak ali metodu zaglađivanja
# postavite na `loess` 
graf + geom_point() + stat_smooth(method=loess)

ZADATAK 12.11 - group estetika

# stvorite još jednom isti graf ali sloju zaglađivanja
# dodajte estetiku `group` postavljenu na `cyl`
# Što smo ovime postigli?
ggplot(mtcars, aes(x = wt, y = mpg, group=cyl))  + geom_point() + stat_smooth(method=loess)

group estetika

Povezanost aspekata statistike i geometrije

ZADATAK 12.12 - stupčasti graf

# nacrtajte stupčani graf varijable `cyl` tablice `mtcars` 
# isprobajte funkcije `geom_bar` i `stat_count`
# ima li razlike?
ggplot(mtcars, aes(x = cyl)) + geom_bar()

ZADATAK 12.13 - histogram

# nacrtajte histogram varijable `wt` tablice `mtcars`
# varijablu podijelite jednoliko u četiri ladice
# koristite funkciju `geom_histogram`
ggplot(mtcars, aes(x = wt)) + geom_histogram(bins = 4)

Kako radi aspekt statistike?

ZADATAK 12.14 - histogram / ncount

# nacrtajte histogram varijable `wt` tablice `mtcars`
# težine podijelite jednoliko u četiri ladice
# koristite funkciju `geom_histogram`
# za agregacijsku varijablu postavite `ncount` 
ggplot(mtcars, aes(x = wt, y=..ncount..)) + geom_histogram(bins = 4)

ZADATAK 12.15 - fill estetika u histogramu

# nacrtajte histogram varijable `wt`, uz dodanu varijablu `cyl` na estetici `fill`
ggplot(mtcars, aes(x = wt, fill = cyl)) + geom_histogram(bins = 4)

Aspekt pozicije

ZADATAK 12.16 - pozicijski aspekt dodge

# nacrtajte opet histogram varijable wt, ali pozicijski aspekt `position` postavite na `"dodge"`
ggplot(mtcars, aes(x = wt, fill = cyl)) + geom_histogram(bins = 4, position="dodge")

ZADATAK 12.17 - pozicijski aspekt identity

# nacrtajte isti histogram uz pozicijski aspekt postavljen na `"identity"`
# postavite `alpha` parametar geometrije na 0.4 zbog jasnijeg prikaza
ggplot(mtcars, aes(x = wt, fill = cyl)) + geom_histogram(bins = 4, position="identity", alpha=0.4)

ZADATAK 12.18 - pozicijski aspekt fill

# konačno, nacrtajte isti histogram uz pozicijski aspekt `"fill"`
# postavite parametar geometrije `color  na "Black" radi ljepšeg prikaza
# objasnite rezultat!
ggplot(mtcars, aes(x = wt, fill = cyl)) + geom_histogram(bins = 4, position="fill", alpha=0.4, color="black")

Pozicijski aspekt jitter

ZADATAK 12.19 - pozicijski aspekt jitter

df <- data.frame( x = c(rep(1, 90), rep(2, 9), 3),
                  y = c(rep(1, 70), rep(2, 25), rep(3, 5)))

# prikažite okvir df uz pomoć `scatterplot` grafa, tj. točkaste geometrije
ggplot(df, aes(x=df$x, y=df$y)) + geom_point()

ZADATAK 12.20 - pozicijski aspekt jitter

# prikažite isti graf, ali umjesto `geom_point` upotrijebite
# pomoćnu funkciju `geom_jitter` koja ima ugrađen `jitter` pozicijski aspekt
# postavite `width` i `height` parametre na 0.3 (30% dodanog šuma)
# dodatno postavite `color` parametar geometrije na "blue" 
# i `alpha` parametar ("prozirnost") na 0.4 
ggplot(df, aes(x=df$x, y=df$y)) + geom_jitter(width = 0.3, height = 0.3, color="blue", alpha=0.4)

Spremanje grafa u datoteku

ZADATAK 12.21 - Spremanje grafa u datoteku

# spremite sljedeći graf u datoteke `figure1.pdf`i `figure1.png`
graph <- ggplot(mtcars, aes(x = hp, y = mpg, col = as.factor(cyl))) + geom_point() + 
geom_smooth(aes(x = hp, y = mpg), method = 'loess', linetype = 4, color = "grey", se = F, inherit.aes = F) +
labs(x = "broj konjskih snaga", y = "potrošnja", col = "broj cilindara")

ggsave(graph, filename = "figure1.pdf")
## Saving 7 x 5 in image
ggsave(graph, filename = "figure1.png")
## Saving 7 x 5 in image

Grafička gramatika i paket ggplot2 (ponavljanje)

Grafovi koriste podatkovni skup te stupce uz pomoć estetika mapiraju na određene vizualizacijske aspekte. Potom uz pomoć geometrija crtamo određene elemente grafova, s tim da ti elementi mogu biti povezani sa estetikama ili definirani fiksno. Statistike nam omogućuju da prije vizualiziranja izračunamo neke sumarne (ili neke druge) statistike originalnih podataka, a pozicijom možemo presložiti vizualne elemente kako bi dodatno prikazali neki odnos ili svojstvo unutar podataka.

Aspekt skale

Skale su aspekt koji kontrolira način kako se to mapiranje provodi, tj. metodu preslikavanja samih podataka na vizualne elemente estetike na koju se oni preslikavaju. U slučaju koordinatnih osi tu se radi o preslikavanju numeričkih ili kategorijskih vrijednosti na konkretne udaljenosti na samim osima, dok npr. kod estetike boje skala odlučuje koja boja označava koju vrijednost originalnih podataka.

Ovaj aspekt je do sada uvijek bio implicitno prisutan, ali smo dopuštali ggplot2 paketu da “odabere” default-ne vrijednosti za nas.

Pomoćne funkcije scale_

Kada radimo sa skalama, najčešće se koristimo ovim pomoćnim funkcijama (* predstavlja “ime estetike”, kao npr. x, y, color itd.):

Parametri scale_ funkcija

Svaka od ovih funkcija ima niz parametara koje možemo koristiti kako bi utjecali na postupak mapiranja. Npr. ako pogledamo dokumentaciju za scale_x_continuous možemo vidjeti da između ostalog možemo postaviti parametre:

Uočite da postoje dodatne pomoćne funkcije koje omogućuju kontrolu gore navedenih parametara i izvan scale_ funkcije, npr. labs za imenovanje osi i legendi, xlim za ograničenje raspona na osi x i sl.

ZADATAK 12.22 - upoznavanje sa podatkovnim skupom diamonds

# učitajte i proučite podatkovni okvir `diamonds`
data("diamonds")
head(diamonds)
glimpse(diamonds)
## # A tibble: 6 x 10
##   carat       cut color clarity depth table price     x     y     z
##   <dbl>     <ord> <ord>   <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  0.23     Ideal     E     SI2  61.5    55   326  3.95  3.98  2.43
## 2  0.21   Premium     E     SI1  59.8    61   326  3.89  3.84  2.31
## 3  0.23      Good     E     VS1  56.9    65   327  4.05  4.07  2.31
## 4  0.29   Premium     I     VS2  62.4    58   334  4.20  4.23  2.63
## 5  0.31      Good     J     SI2  63.3    58   335  4.34  4.35  2.75
## 6  0.24 Very Good     J    VVS2  62.8    57   336  3.94  3.96  2.48
## Observations: 53,940
## Variables: 10
## $ carat   <dbl> 0.23, 0.21, 0.23, 0.29, 0.31, 0.24, 0.24, 0.26, 0.22, ...
## $ cut     <ord> Ideal, Premium, Good, Premium, Good, Very Good, Very G...
## $ color   <ord> E, E, E, I, J, J, I, H, E, H, J, J, F, J, E, E, I, J, ...
## $ clarity <ord> SI2, SI1, VS1, VS2, SI2, VVS2, VVS1, SI1, VS2, VS1, SI...
## $ depth   <dbl> 61.5, 59.8, 56.9, 62.4, 63.3, 62.8, 62.3, 61.9, 65.1, ...
## $ table   <dbl> 55, 61, 65, 58, 58, 57, 57, 55, 61, 61, 55, 56, 61, 54...
## $ price   <int> 326, 326, 327, 334, 335, 336, 336, 337, 337, 338, 339,...
## $ x       <dbl> 3.95, 3.89, 4.05, 4.20, 4.34, 3.94, 3.95, 4.07, 3.87, ...
## $ y       <dbl> 3.98, 3.84, 4.07, 4.23, 4.35, 3.96, 3.98, 4.11, 3.78, ...
## $ z       <dbl> 2.43, 2.31, 2.31, 2.63, 2.75, 2.48, 2.47, 2.53, 2.49, ...

ZADATAK 12.23 - uzorkovanje skupa diamonds

set.seed(1001)
# stvorite okvir `diamondsSample` u koji ćete staviti
# 5000 nasumičnih redaka iz okvira `diamonds`
diamondsSample = sample_n(diamonds, size = 5000)

ZADATAK 12.24 - korištenje aspekta skale

# "popravite" osi i legendu grafa koji prikazuje ovisnost veličine dijamanta, boje i cijene
# - osi x i y nazovite "volumen u mm3" i "cijena u $"
# - legendu nazovite "kvaliteta boje"
# - os x ograničite od 0 do 500
# - na osi y postavite crtice na 1000, 5000, 10000 i 20000
# - kategorije kvalitete boje postavite na brojeve od 1 do 7 gdje 1 predstavlja "najbolju" boju
ggplot(diamondsSample, aes(x*y*z, price, color = color)) + 
  geom_point(alpha = 0.5) + scale_x_continuous(name="volumen u mm3", limits = c(0,500)) + scale_y_continuous(name="cijena u $", breaks = c(1000, 5000, 10000, 15000))   + scale_color_discrete(name="kvaliteta boje", labels = 1:7)
## Warning: Removed 6 rows containing missing values (geom_point).

Logaritamska skala

Vrlo često se događa da na grafovima uočavamo tzv. “eksponencijalni trend”, tj. da nas ovisnost jedna varijable u drugoj podsjeća na eksponencijalnu funkciju.

Ako želimo eksponencijalni trend pretvoriti u linearni, možemo pokušati logaritmirati podatke (što će onda utjecati na prikazane vrijednosti). Umjesto da diram podake, ggplot2 nam nudi opciju da umjesto stadnardne koristimo logaritmiranu (ili neku drugu) skalu. Konkretno, umjesto funkcije scale_*_continuous možemo odabrati:

ZADATAK 12.25 - logaritamska skala

# logaritmirajte cijenu dijamanta u prethodno izvedenom grafu
ggplot(diamondsSample, aes(x*y*z, price, color = color)) + geom_point(na.rm = T, alpha = 0.6) +
  scale_x_continuous(name = "volumen u mm3" , limits = c(0, 450)) +
  scale_y_log10(name = "cijena u $", breaks = c(1000, 5000, 10000, 15000)) +
  scale_color_discrete(name = "kvaliteta boje", labels = 1:7)

Skale za prilagodbu boja

Estetike color i fill se vrlo često dodatno podešavaju uz pomoć skala. Za ovo imamo zgodne funkcije (dajemo primjere za fill estetike iako većina funkcija postoji i za color):

ZADATAK 12.26 - prilagodba boja na grafu

# podesite `fill` estetiku sljedećeg grafa korištenjem funkcije `scale_fill_brewer`
# parametar `palette` postavite na jednu od sljedećih paleta:
# Blues, BuPu, Greens, Greys, Oranges, OrRd, PuBu, PuRd, Purples, YlGn, YlOrRd
# (još paleta možete naći u dokumentaciji)
ggplot(diamondsSample, aes(x = x*y*z, fill = color)) + geom_histogram(bins = 30, na.rm = T) + 
  xlim(0, 500) + scale_fill_brewer(palette = "Greens")

Aspekt koordinatnog sustava

Aspekt koordinatnog sustava vrlo rijetko mijenjamo. Razlog tome je što u najvećem broju slučajeva želimo koristiti Kartezijev koordinatni sustav koji ggplot koristi po default-u. Ukoliko smatramo da naša vizualizacija zahtijeva nešto drugo - bilo da se radi o polarnom koordinatnom sustavu, ili želimo “izvrnuti” naš Kartezijev sustav na stranu, ili - što je posebno važno kod analize zemljopisnih podataka - želimo da naša vizualizacija prikazuje zemljopisnu kartu, možemo između ostalog koristiti sljedeće funkcije:

ZADATAK 12.27 - “izvrnuti” i polarni koordinatni sustavi

# pogledajte kako sljedeći graf izgleda u "izvrnutom" a kako u polarnom koordinatnom sustavu
ggplot(diamondsSample, aes(x = x*y*z, fill = color)) + geom_histogram(bins = 30, na.rm = T) + 
  xlim(40, 100) + coord_flip()

ggplot(diamondsSample, aes(x = x*y*z, fill = color)) + geom_histogram(bins = 30, na.rm = T) + 
  xlim(40, 100) + coord_polar()

Aspekt teme

Konačno aspekt teme grafa nam omogućuje da utječemo na sve vizualne aspekte grafa koji nisu povezani s podacima. To znači da možemo birati boju i izgled pozadine, font i veličinu slova, margine, poravnavanja i još niz drugih parametara grafa. Tema nam daje iznimno detaljnu kontrolu nad izgledom grafa, a budući da se zapravo radi o objektu (klase theme), temu grafa možemo pohraniti i reciklirati za sve buduće vizualizacije. Isto tako, ggplot2 nudi niz već unaprijed pripremljenih tema za korištenje i daljnju prilagodbu, a koje dohvaćamo uz skup pomoćnih funkcija od kojih su neke:

ZADATAK 12.28 - izmjena teme grafa

# promijenite temu sljedećem grafu na `theme_classic`
ggplot(diamondsSample, aes(x = x*y*z, fill = color)) + geom_histogram(bins = 30, na.rm = T) + 
  xlim(0, 500) 

Izmjena pojedinih elemenata teme

Često želimo promijeniti samo neki od aspekata grafa koji nije vezan uz podatke (npr. veličina ili orijentacija slova, izgled crtica na osima i sl.). Za ove stvari koristimo funkciju theme koja sadrži vrlo bogati niz parametara (pogledati dokumentaciju!). Neke od tih parametara su tzv. “elementi” teme (npr. element_line, element_text) koje namještamo pozivom pripadne funkcije unutar poziva funkcije theme, npr:

# mijenjamo izgled naziva grafa 
# (za obitelj fontova preporučeno koristiti `serif`, `sans` ili `mono`)
... + theme( title = element_text(family = 'serif', face = 'bold.italic'))

ZADATAK 12.29 - izmjena elementa teme grafa

# promijenite orijentaciju slova na x osi tako da budu pod kutem od 45 stupnjeva
ggplot(diamondsSample, aes(cut)) + geom_bar() + theme(axis.title.x = element_text(angle = 45))

Uvjetni (facetirani) grafovi

Već smo se upoznali sa estetikom grupiranja, koja prije vizualizacije unutar skupa podataka radi podskupove po odabranoj varijabli te ih shdono tome na adekvatan način vizualizira. Također smo naučili da možemo raditi implicitna grupiranja uz pomoć estetika boje, oblika, veličine i sl.

Uvjetni (facetirani) grafovi rade na istom principu, ali razdvajanje po odabranoj varijabli (ili varijablama) radi se na način da se vizualizira više grafova koji se onda prikazuju jedan pored drugoga. Rezultatni grafovi prikazuju istu informaciju kao i estetika (implicitne ili eksplicitne) grupe, ali je ovako nešto lakše proučiti svaki podgraf zasebno.

Notacija statističkih formula

Prije demonstracije kako radimo uvjetno grafove moramo objasniti pojam tzv. “notacije statističkih formula” (statistical formula notation). Ova notacija se često koristi u R-u, pogotovo kod treniranja raznih statističkih modela, a radi se zapravo o formalnoj notaciji međuovisnosti varijabli nekog podatkovnog skupa zamišljenoj na način da se može na što kraći i jednostavniji način zapisati i ugraditi u programski kod.

Formule ćemo detaljnije obrađivati kasnije, a za sada ćemo pokazati samo vrlo jednostavan primjer. Ako želimo zapisati “y u ovisnosti o x-u”, onda formula izgleda ovako:

y ~ x          # znači "y u ovisnosti o x-u"

ovo možemo čitati i kao “y kao funkcija od x” ili - u slučaju linearnih modela - “y = ax + b”. Dakle, znak tilda (~) zapravo znači “u ovisnosti o”.

Notacija statističkih formula (2)

Prikažimo još neke jednostavnije oblike formula:

z ~ x + y  # z u ovisnost o x i y (plus ovdje nije aritmetičko zbrajanje!)
y ~ .      # y u ovisnosti o "svim ostalim varijablama"
. ~ y      # "sve ostale varijable" u ovisnosti o y
~ y        # tzv. "jednostrana" formula, "u ovisnosti o y"

Zadnja dva primjera je malo teže matematički definirati no znaju se koristiti u pozivima funkcija za različite svrhe, većinom zbog jednostavnog zapisa i lake interpretacije.

Funkcije za stvaranje uvjetovanih grafova

Postoji dva osnovna načina stvaranja uvjetnih grafova, a to je uz pomoć funkcija

Funkciju facet_grid koristimo kad podskupove radimo po jednoj ili dvije kategorijske varijable. Rastavljanje po dvije varijable prirodno radi “matricu”, dok rastavljanje po jednoj će napraviti redak ili stupac, što možemo kontrolirati formulom. Funkciju facet_wrap koristimo kada želimo rastaviti po jednoj varijabli, ali ne želimo da svi budu u jednom stupcu ili retku već ih želimo presložiti u više redaka (zato je i wrap, slično kao word wrap u uređivaču teksta koji prenosti tekst u drugi red).

ZADATAK 12.30 - funkcija facet_grid

# reduciramo uzorak kako bi radili sa faktorima sa manjim brojem razina
diamondsSample %>% filter(color %in% c("G", "H", "I", "J"),
                  cut %in% c("Very Good", "Premium", "Ideal")) -> diamondsSample2

# napravite uvjetni graf u ovisnosti o kombinaciji boje (`color`) i reza (`cut`)
# koristite funkciju `facet_grid` i formulu kao parametar
ggplot(diamondsSample2, aes(depth, fill = clarity)) + geom_histogram(bins = 5,  position = 'dodge') + facet_grid(facets = color ~ cut)

ZADATAK 12.31 - funkcija facet_grid (2)

# ponovite postupak, ali sada rastavite samo po boji
# grafove organizirajte u stupac
# koristite funkciju `facet_grid` i notaciju formule sa točkom
ggplot(diamondsSample2, aes(depth, fill = clarity)) + geom_histogram(bins = 5,  position = 'dodge') + facet_grid(facets = color ~ .)

ZADATAK 12.32 - funkcija facet_wrap

# razdvojite sljedeći graf u ovisnosti o prozirnosti (`clarity`)
# koristite funkciju `facet_wrap` i jednostranu formulu
ggplot(diamondsSample, aes(x*y*z, price)) + geom_point()  + facet_wrap(~ clarity)

Dodatni vizualizacijski paketi

Ovime završavamo priču o gramatičkoj geometriji, njezinim aspektima i primjeni uz pomoć paketa ggplot2. Ovdje nisu ni približno objašnjenje sve mogućnosti ovoga paketa, zbog čega se snažno preporučuje dodanto čitanje dokumentacije i referenciranje na podsjetnik koji sadrži niz geometrija i opcija za koje u ovim lekcijama nije bilo mjesta. Također, ne treba zaboraviti na niz dodatnih paketa koji dodatno proširuju mogućnosti paketa ggplot2, a koje bi trebalo potražiti u ovisnosti o našim zahtjevima i željama glede vizualizacija koje želimo stvoriti za naše projekte podatkovne analize. Za inspiraciju zgodno je pogledati galeriju grafova i slika nastalih uz pomoć jezika R, a koja je dostupna na ovoj poveznici .

Grafovi u eksploratornoj analizi i izvještavanju

Kod eksploratorne analize podataka često je glavni cilj - kvantiteta. Već je rečeno da se eksploratorna analiza svodi na traženje odgovora za niz pitanja koje analitičar postavlja vezano uz podatke. Estetika ovdje često nije bitna - glavno je da grafovi imaju dovoljno informacija da se kod naknadnog pregledavanja može ono što je predočeno staviti u odgovarajući kontekst. Analitičar će također često isprobavati različite kombinacije estetika, geometrija i statistika.

Grafovi u eksploratornoj analizi i izvještavanju (2)

#library(GGally)  # ako nije učitan!
ggpairs(data = mtcars[,1:6])

Grafovi u eksploratornoj analizi i izvještavanju (3)

Kod izvještavanja s druge strane ključna je kvaliteta grafa u smislu jasnog i preglednog predstavljanja informacije. Graf mora jasno komunicirati informacije koje su njime predočene, uz pažljivo odabrana objašnjenja i pomno odabrano korištenje tzv. metapodataka, tj. dodatnog teksta i anotacija. Za stvaranje izvještajnih grafova preporučuje se koristiti dodatne geom_text slojeve za tekstualnim oznakama na odgovarajućim područjima grafa gdje one mogu najviše doprinijeti, a također i kreativno korištenje geom_point, geom_hline, geom_vline, geom_rect i sličnih geometrijskih slojeva koji će dodatno pojasniti određene segmente grafa. Isto tako, preporučuje se unaprijed pripremiti temu koju ćemo onda konzistentno primjenjivati na sve grafove.

U velikom slučajeva grafovi u izvještajima su zapravo probrani i “uljepšani” grafovi dobiveni tijekom eksploratorne analize. No analitičar bi trebao posebnu pažnju posvetiti činjenici da se grafovi u izvještajima često rade za publiku koja je daleko manje upoznata sa podatkovnim skupom i raznim detaljnim saznanjima koje je analitičar dobio tijekom eksploratorne analize. Izvještajni grafovi stoga moraju biti orijentirani krajnjem korisniku, te s tim ciljem i pažljivo dizajnirani. Zbog toga se preporučuje da svi elementi grafa - uključujući i naslov, legende i sl. budu orijentirani komunikaciji informacije i razjašnjenju što graf prikazuje, a što je u skladu sa zaključcima koje publikacija iznosi.

Grafovi u eksploratornoj analizi i izvještavanju (4)

Konačno, ponekad želimo zbog štednje prostora unutar jedne slike staviti više različitih grafova. Ovo obično radimo uz pomoć više zasebnih slika koje slažemo unutar sučelja kojeg koristimo za pisanje publikacije čiji su dio navedeni grafovi, no možemo i unaprijed pripremiti grafove uz pomoć paketa gridExtra. Između ostalog, ovaj paket nudi funkciju grid.arrange uz pomoć koje grafove slažemo u matricu s odabranim brojem redaka i stupaca.

Grafovi u eksploratornoj analizi i izvještavanju (5)

#library(gridExtra)    # ukoliko je potrebno

# grafove koje slažem u matricu pohranjujem u varijable
g1 <- ggplot(diamondsSample, aes(x*y*z, price, color = color)) + geom_point(alpha = 0.6)
g2 <-ggplot(diamondsSample, aes(x = x*y*z, fill = color)) + geom_histogram(bins = 30, na.rm = T) + 
             scale_fill_brewer(palette = "Greens")
g3 <- ggplot(diamondsSample, aes(x = cut)) + geom_bar(fill = "blue", alpha = 0.5)
g4 <- ggplot(diamondsSample, aes(x = color, fill = clarity)) + geom_bar() + coord_polar()

Grafovi u eksploratornoj analizi i izvještavanju (6)

grid.arrange(g1, g2, g3, g4, nrow = 2, ncol = 2)